/*
 * @Author: tanjunyi@doctorwork.com
 * @Date: 2020-06-16 09:52:00
 * @LastEditors: tanjunyi@doctorwork.com
 * @LastEditTime: 2020-06-25 16:08:53
 * @Description:
 */
import { initState } from './state';
import { compildToFunction } from './compiler/index'
import { mountComponent, callHook } from './lifecyle'
import { mergeOptions } from './util/index'
import { nextTick } from './observer/scheduler';


export function initMixin(Vue) {
	Vue.prototype.$nextTick = nextTick;
	Vue.prototype._init = function (options) {
		const vm = this;
		vm.$options = mergeOptions(vm.constructor.options, options); //用户传递的属性
		// 执行beforeCreate生命周期
		callHook(vm, 'beforeCreate');
		// 初始化状态
		initState(vm); //分割代码
		callHook(vm, 'created'); //执行创建完成生命周期
		// 如果用户传入了el属性，需要将页面渲染出来
		if (vm.$options.el) {
			vm.$mount(vm.$options.el);
		}
	}
	/**
	 * 数据挂载
	 * @param {*} el 
	 */
	Vue.prototype.$mount = function (el) {
		console.log("------- mount ------")
		const vm = this;
		const options = vm.$options;
		vm.$el = el = document.querySelector(el);
		// 默认现查找render ， 没有render 采用template ，如果也没有就用el
		if (!options.render) {
			// 对模板进行编译
			let template = options.template;
			if (!template && el) {
				template = el.outerHTML;

			}
			// 将模板解析成虚拟dom   Vnode
			const render = compildToFunction(template);
			options.render = render;
			// 需要将template 转换成render方法
			// console.log(render)

			// 虚拟DOM构建完成，需要进行组件的挂载流程
			mountComponent(vm, el);
		}
	}
}